package com.genwan.sdk_test_demo;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;

import com.gwsdk.open.AuthenticationResult;
import com.gwsdk.open.PrivacyCallback;
import com.gwsdk.open.RealNameAuthenticationCallback;
import com.gwsdk.open.RoleInfo;
import com.gwsdk.open.GPExitResult;
import com.gwsdk.open.GPUserResult;
import com.gwsdk.open.IGPExitObsv;
import com.gwsdk.open.IGPUserObsv;
import com.gwsdk.open.GWApi;
import com.gwsdk.open.OrderInfo;
import com.gwsdk.open.PayCallback;
import com.gwsdk.open.UploadRoleCallBack;
import com.gwsdk.open.LogoutCallback;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    private int shopPrice = 600;  //测试金额（单位：分）
    private Activity activity;
    private static String extra_param;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
            finish();
            return;
        }
        activity = this;
        setContentView(R.layout.activity_sdk_main);
        setTranslucentStatus(this);
        sdkInit();
        initView();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        GWApi.getApi().onActivityResult(requestCode, resultCode, data);
    }

    public void setTranslucentStatus(Activity act) {
        if (null == act) {
            return;
        }
        Window window = act.getWindow();
        if (null == window) {
            return;
        }
        // 5.0以上系统状态栏透明
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }


    /**
     * 初始化相关功能
     */
    private void sdkInit() {

        // 1.初始化SDK
        GWApi.getApi().init(this, true);
        //设置登录回调
        GWApi.getApi().setLoginCallback(loginCallback);
        // 2.账号注销监听初始化
        GWApi.getApi().initLogoutCallback(logoutCallback);
        // 3.游戏过程中玩家在sdk内实名认证监听初始化
        GWApi.getApi().initRealNameAuthenticationCallback(authenticationCallback);
    }

    private void initView() {
        //设置游戏参数按钮（demo界面的测试功能，无需对接）
        findViewById(R.id.btn_privacy_dialog).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                GWApi.getApi().allowPrivacy(activity, new PrivacyCallback() {
                    @Override
                    public void userPrivacy(int result) {
                        if (result == 1) {
                            //同意隐私协议
                            //MCApiFactory.getApi().startlogin(activity, loginCallback);
                        }
                    }
                });
            }
        });


        //登录按钮
        findViewById(R.id.login).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //如果sdk用户没登录，调用登录弹窗
                if (!GWApi.getApi().isLogin()) {
                    GWApi.getApi().startlogin(activity);
                }
            }
        });

        //充值按钮
        findViewById(R.id.btnPay).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                //设置道具参数，调用sdk支付界面（以下参数为必填参数，如果没有可传"0"）
                OrderInfo order = new OrderInfo();
                order.setProductName("钻石礼包");                //游戏道具名称
                order.setProductDesc("钻石可用于购买游戏内道具");  //游戏道具描述
                order.setAmount(shopPrice);                     //游戏道具价格（单位分）
                order.setServerName("江苏一区");                 //游戏区服名
                order.setGameServerId("12");                    //游戏区服ID
                order.setRoleName("放学你别跑");                 //游戏角色名
                order.setRoleId("10");                          //游戏角色ID
                order.setRoleLevel("70");                       //游戏角色等级
                order.setGoodsReserve("其它信息");               //角色其它信息（例如帮派，转生）
                order.setExtra_param(extra_param);  //平台方的预留标识（默认值是平台域名，sdk用户登录成功时获取，不需改动）

                //游戏方的透传参数，服务端支付回调时原样返回，建议传订单号（当前demo用系统时间模拟订单号，正式接入时请传订单号）
                order.setExtendInfo(String.valueOf(System.currentTimeMillis()));

                GWApi.getApi().pay(activity, order, payCallback);
            }
        });


        //上传角色
        findViewById(R.id.btnUploadRole).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                //设置游戏角色参数，调用上传角色方法（以下参数为必填参数，如果没有可传“0”）
                RoleInfo userInfo = new RoleInfo();
                userInfo.setServerId("345678");         //游戏区服id
                userInfo.setServerName("北京一区");  //游戏区服名字
                userInfo.setRoleName("关羽");  //游戏角色名字
                userInfo.setRoleId("123456");           //游戏角色ID
                userInfo.setRoleLevel("175");        //游戏角色等级
                userInfo.setRoleCombat("999");   //角色战力值
                userInfo.setPlayerReserve("化圣九层");   //角色其它信息（例如帮派，转生）
                GWApi.getApi().uploadRole(userInfo, uploadRoleCallBack);
            }
        });

        //注销按钮
        findViewById(R.id.btnLogout).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //注销当前登录帐号
                GWApi.getApi().loginout(activity);
            }
        });

        //退出程序按钮
        findViewById(R.id.btnExit).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //弹出确认退出程序弹窗
                GWApi.getApi().exitDialog(activity, mExitObsv);
            }
        });
    }


    /**
     * sdk用户登录回调
     */
    private IGPUserObsv loginCallback = new IGPUserObsv() {
        @Override
        public void onFinish(GPUserResult result) {
            switch (result.getmErrCode()) {
                case GPUserResult.USER_RESULT_LOGIN_FAIL:
                    Log.e(TAG, "sdk登录回调：登录失败");
                    break;
                case GPUserResult.USER_RESULT_LOGIN_SUCC:
                    String uid = result.getAccountNo();     //用户id（用户唯一标识）
                    String token = result.getToken();       //用户token
                    int ageStatus = result.getAgeStatus();  //用户实名认证状态：2认证通过且已成年 -1用户不存在 0未认证 1认证失败 3认证通过但未成年
                    String birthday = result.getBirthday(); //实名认证用户生日信息
                    extra_param = result.getExtra_param();  //sdk预留的标识，发起支付方法时再传给sdk
                    Log.w(TAG,"sdk登录成功,"+"userid = " + uid + "，token = " + token
                            + "，ageStatus = " + ageStatus + "， birthday = " + birthday);

                    //游戏在这时需要拿到以上userid和token到sdk服务端验证登录结果（详见《游戏登录支付通知接口文档》）
                    break;
            }
        }
    };


    /**
     * 帐号注销回调
     */
    private LogoutCallback logoutCallback = new LogoutCallback() {
        @Override
        public void logoutResult(String result) {
            if (TextUtils.isEmpty(result)) {
                return;
            }
            if ("1".equals(result)) {
                Log.i(TAG, "sdk注销回调：注销成功");
                GWApi.getApi().stopFloating(activity); //关闭悬浮球
                GWApi.getApi().startlogin(activity); //调用登录弹窗
            } else {
                Log.e(TAG, "sdk注销回调：注销失败");
            }
        }
    };


    /**
     * 上传角色回调
     */
    private UploadRoleCallBack uploadRoleCallBack = new UploadRoleCallBack() {
        @Override
        public void onUploadComplete(String result) {
            if ("1".equals(result)) {
                Log.i(TAG,"sdk上传角色回调：上传角色成功");
                Toast.makeText(activity,"上传角色成功", Toast.LENGTH_LONG).show();
            }else {
                Log.e(TAG,"sdk上传角色回调：上传角色失败");
                Toast.makeText(activity,"上传角色失败", Toast.LENGTH_LONG).show();
            }
        }
    };


    /**
     * 支付结果回调
     */
    private PayCallback payCallback = new PayCallback() {
        @Override
        public void callback(String errorcode) {
            if (TextUtils.isEmpty(errorcode)) {
                return;
            }
            Log.w(TAG, errorcode);
            if ("0".equals(errorcode)) {
                Log.i(TAG,"sdk支付回调：支付成功");
                Toast.makeText(activity, "支付成功", Toast.LENGTH_LONG).show();
            } else {
                Log.e(TAG,"sdk支付回调：支付失败");
                Toast.makeText(activity, "支付失败", Toast.LENGTH_LONG).show();
            }
        }
    };


    /**
     * 退出程序回调接口
     */
    private IGPExitObsv mExitObsv = new IGPExitObsv() {
        @Override
        public void onExitFinish(GPExitResult exitResult) {
            switch (exitResult.mResultCode) {
                case GPExitResult.GPSDKExitResultCodeCloseWindow:
                    Log.i(TAG, "退出回调:点击了退出程序确认弹窗中【取消】按钮");
                    break;
                case GPExitResult.GPSDKExitResultCodeExitGame:
                    Log.i(TAG, "退出回调:点击了退出程序确认弹窗中【确定】按钮，开始执行退出程序操作");
                    GWApi.getApi().stopFloating(activity);  //关闭悬浮窗
                    //退出程序
                    finish();
                    System.exit(0);
                    break;
            }
        }
    };


    /**
     * 游戏过程中，玩家在sdk内成功进行了实名认证 通知回调
     */
    private RealNameAuthenticationCallback authenticationCallback = new RealNameAuthenticationCallback() {
        @Override
        public void authenticationResult(AuthenticationResult result) {
            int ageStatus = result.AgeStatus;       //用户实名认证状态：2认证通过且已成年
            String birthday = result.UserBirthday;  //实名认证用户生日信息 示例：19950712

            if (ageStatus == 2){
                Log.i(TAG,"sdk实名认证回调：成功在sdk内进行了实名认证，且已满18周岁，" +
                        "现在游戏可以对该玩家解除相关防沉迷限制,该玩家生日为：" + birthday);
            }else {
                //退出程序
                finish();
                System.exit(0);
            }
        }
    };



    /**
     * 生命周期onResume()
     * 游戏从后台开始，开始计时,显示悬浮球等
     */
    @Override
    protected void onResume() {
        super.onResume();
        GWApi.getApi().onResume(activity);  //用户上线：开始计时、请求后台悬浮球开关设置等
    }

    /**
     * 生命周期onPause()
     * 游戏不可见时，隐藏悬浮球
     */
    @Override
    protected void onPause() {
        super.onPause();
        GWApi.getApi().onPause(activity);
    }

    /**
     * 生命周期onStop()
     * 游戏进入后台或退出游戏时，请求下线（下线通知）
     */
    @Override
    protected void onStop() {
        super.onStop();
        GWApi.getApi().onStop(activity);  //游戏结束用户下线  统计设备
    }


    /**
     * 生命周期onDestroy()
     * 退出游戏时，关闭相关弹窗及功能处理
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        GWApi.getApi().onDestroy();  //关闭相关弹窗及功能处理
    }


    /**
     * 返回按键，弹出退出程序确认弹窗
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
            GWApi.getApi().exitDialog(activity, mExitObsv);  //弹出确认退出程序弹窗
            return false;
        }
        return super.onKeyDown(keyCode, event);
    }
}
